package org.i0o.webplus.commons.util;

import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 验证工具类
 * 
 * @author Felix
 */
public class ValidateUtil {

	/**
	 * 判断制定字符串是否属于制定字符串数组中的一个元素
	 * 
	 * @param strSearch 字符串
	 * @param stringArray 字符串数组
	 * @param caseInsensetive 是否不区分大小写, true为不区分, false为区分
	 * @return 判断结果
	 */
	public static boolean inArray(String strSearch, String[] stringArray, boolean caseInsensetive) {
		return StringUtil.getInArrayId(strSearch, stringArray, caseInsensetive) >= 0;
	}

	/**
	 * 判断制定字符串是否属于制定字符串数组中的一个元素
	 * 
	 * @param strSearch 字符串
	 * @param stringArray 字符串数组
	 * @return 判断结果
	 */
	public static boolean inArray(String strSearch, String[] stringArray) {
		return inArray(strSearch, stringArray, false);
	}

	/**
	 * 判断指定字符串是否属于指定字符串数组中的一个元素
	 * 
	 * @param strSearch 字符串
	 * @param stringArray 内部分割单词的字符串
	 * @param strSplit 分割字符串
	 * @return 判断结果
	 */
	public static boolean inArray(String strSearch, String stringArray, String strSplit) {
		return inArray(strSearch, StringUtil.splitString(stringArray, strSplit));
	}

	/**
	 * 判断指定字符串是否属于指定字符串数组中的一个元素
	 * 
	 * @param strSearch 字符串
	 * @param stringArray 内部以逗号分割单词的字符串
	 * @return 判断结果
	 */
	public static boolean inArray(String strSearch, String stringArray) {
		return inArray(strSearch, StringUtil.splitString(stringArray, ","));
	}

	/**
	 * 判断指定字符串是否属于指定字符串数组中的一个元素
	 * 
	 * @param strSearch 字符串
	 * @param stringArray 内部以逗号分割单词的字符串
	 * @param strsplit 分割字符串
	 * @param caseInsensetive 是否不区分大小写, true为不区分, false为区分
	 * @return 判断结果
	 */
	public static boolean inArray(String strSearch, String stringArray, String strsplit, boolean caseInsensetive) {
		return inArray(strSearch, StringUtil.splitString(stringArray, strsplit), caseInsensetive);
	}

	/**
	 * 检查字符串长度
	 * 
	 * @param str 字符串
	 * @param minLength 最小长度
	 * @param maxLength 最大长度
	 * @return 检查结果
	 */
	public static boolean checkLength(String str, int minLength, int maxLength) {
		if (maxLength < minLength) { return false; }

		if (ValidateUtil.isBlank(str)) {
			if (minLength == 0) { return true; }
			return false;
		}
		int length = str.length();
		if (length >= minLength && length <= maxLength) { return true; }
		return false;
	}

	/**
	 * 判断对象是否为空
	 * 
	 * @param obj 要判断的对象
	 * @return 判断结果
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isBlank(Object obj) {
		if (obj == null) { return true; }

		if (obj instanceof String) { return "".equals(((String) obj).trim()); }

		if (obj instanceof Collection) {
			Collection collection = (Collection) obj;
			return collection.isEmpty() || collection.size() == 0;
		}

		return false;
	}

	/**
	 * 检查参数是否有空
	 * 
	 * @param objects
	 * @return
	 */
	public static boolean hasBlank(Object... objects) {
		for (Object obj : objects) {
			if (isBlank(obj)) return true;
		}
		return false;
	}

	/**
	 * 判断字符串是否和正则表达式相匹配
	 * 
	 * @param str 字符串
	 * @param regEx 正则表达式
	 * @param caseInsensetive 是否不区分大小写, true为不区分, false为区分
	 * @return 判断结果
	 */
	public static boolean isMatch(String str, String regEx, boolean caseInsensetive) {
		if (!hasBlank(str, regEx)) {
			Pattern pattern = null;
			if (caseInsensetive) {
				pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
			} else {
				pattern = Pattern.compile(regEx);
			}
			Matcher matcher = pattern.matcher(regEx);
			return matcher.find();
		}
		return false;
	}

	/**
	 * 判断字符串是否和正则表达式相匹配,大小写敏感
	 * 
	 * @param str 字符串
	 * @param regEx 正则表达式
	 * @return 判断结果
	 */
	public static boolean isMatch(String str, String regEx) {
		return isMatch(str, regEx, false);
	}

	/**
	 * 判断是否为IP字符串
	 * 
	 * @param ipStr ip字符串
	 * @return 判断结果
	 */
	public static boolean isIP(String ipStr) {
		return isMatch(ipStr, "^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$");
	}

	/**
	 * 判断是否为正整数字符串
	 * 
	 * @param intStr 数字字符串
	 * @return 判断结果
	 */
	public static boolean isInt(String intStr) {
		return isMatch(intStr, "^[0-9]*$");
	}

	/**
	 * 判断是否是URL地址字符串
	 * 
	 * @param strUrl URL地址字符串
	 * @return 判断结果
	 */
	public static boolean isURL(String strUrl) {
		return isMatch(
				strUrl,
				"^(http|https)\\://([a-zA-Z0-9\\.\\-]+(\\:[a-zA-Z0-9\\.&%\\$\\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{1,10}))(\\:[0-9]+)*(/($|[a-zA-Z0-9\\.\\,\\?\\'\\\\\\+&%\\$#\\=~_\\-]+))*$");
	}

	/**
	 * 判断是否是Email地址字符串
	 * 
	 * @param strEmail URL地址字符串
	 * @return 判断结果
	 */
	public static boolean isEmail(String strEmail) {
		return isMatch(strEmail, "^@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$");
	}

	/**
	 * 判断是否是数字
	 * 
	 * @param strNumber 数字字符串
	 * @return 判断结果
	 */
	public static boolean isNumber(String strNumber) {
		return isMatch(strNumber, "^\\d+$");
	}

	/**
	 * 判断是否是Base64字符串
	 * 
	 * @param str Base64字符串
	 * @return 判断结果
	 */
	public static boolean isBase64(String str) {
		return isMatch(str, "[A-Za-z0-9\\+\\/\\=]");
	}

	/**
	 * 判断是否是Sql危险字符
	 * 
	 * @param sqlStr sql字符串
	 * @return 判断结果
	 */
	public static boolean isSafeSqlString(String sqlStr) {
		return isMatch(sqlStr, "[-|;|,|\\/|\\(|\\)|\\[|\\]|\\}|\\{|%|@|\\*|!|\\']");
	}
}
